from pydantic import BaseModel


class CalendarStartModel(BaseModel):
    """
    日程安排的起始时间。
    如果是全天日程：date必须有值，dateTime必须留空，timeZone必须留空。
    如果是非全天日程：date必须留空，dateTime必须有值，timeZone必须有值。
    """

    date: str|None = None
    """日程开始日期，格式：yyyy-MM-dd。比如：2025-06-06。全天日程必须有值，非全天日程必须留空。"""

    dateTime: str|None = None
    """日程开始时间，格式为ISO-8601的格式：yyyy-MM-ddThh:mm:ss+08:00，比如：2025-06-06T13:53:44.034864+08:00。全天日程必须留空，非全天日程必须有值。"""

    timeZone: str|None = None
    """日程开始时间所属时区，TZ database name格式。全天日程必须留空，非全天日程必须有值，在有值的情况下，值为：Asia/Shanghai。"""


class CalendarEndModel(BaseModel):
    """
    日程安排的结束时间。
    全天日程：date必须有值，dateTime必须留空，timeZone必须留空。
    非全天日程：date必须留空，dateTime必须有值，timeZone必须有值。
    """

    date: str|None = None
    """日程开始日期，格式：yyyy-MM-dd。比如：2025-06-06。全天日程必须有值，且结束时间需传T+1，例如2025-06-01的全天日程，开始时间为2024-06-01，则结束时间应该写2024-06-02。非全天日程必须留空。"""

    dateTime: str|None = None
    """日程开始时间，格式为ISO-8601的格式：yyyy-MM-ddThh:mm:ss+08:00，比如：2025-06-06T13:53:44.034864+08:00。全天日程必须留空，非全天日程必须有值。"""

    timeZone: str|None = None
    """日程开始时间所属时区，TZ database name格式。全天日程必须留空，非全天日程必须有值，在有值的情况下，值为：Asia/Shanghai。"""


class CalendarCreateInputModel(BaseModel):
    # https://open.dingtalk.com/document/orgapp/create-event
    """
    创建日程所需参数的模型。
    """

    sender_staff_id: str
    """发送消息的员工的ID"""

    summary: str
    """日程标题，最大不超过2048个字符。"""

    description: str|None = None
    """日程描述，最大不超过5000个字符。"""

    start: CalendarStartModel|None = None
    """日程开始时间。"""

    end: CalendarEndModel|None = None
    """日程结束时间。"""

    isAllDay: bool
    """是否全天日程。如果在一天中有时间限制，则为False，否则为True。"""


class CalendarQueryInputModel(BaseModel):
    """
    查询日程的工具的参数模型
    """

    sender_staff_id: str
    """发送消息的员工的ID"""

    timeMin: str|None = None
    """日程开始时间的最小值，格式为ISO-8601的date-time格式，可不填。"""

    timeMax: str|None = None
    """日程开始时间的最大值，格式为ISO-8601的date-time格式，可不填。"""


class CalendarDeleteInputModel(BaseModel):
    """
    删除指定日程的参数模型
    """

    sender_staff_id: str
    """发送消息的员工的ID"""

    calendar_id: str
    """日程的ID"""


class CalendarModel(BaseModel):
    # https://open.dingtalk.com/document/orgapp/create-event
    """
    日程的模型。
    """

    summary: str|None = None
    """日程标题，最大不超过2048个字符。"""

    description: str|None = None
    """日程描述，最大不超过5000个字符。"""

    start: CalendarStartModel|None = None
    """日程开始时间。"""

    end: CalendarEndModel|None = None
    """日程结束时间。"""

    isAllDay: bool|None = None
    """是否全天日程。如果在一天中有时间限制，则为False，否则为True。"""


class CalendarModifyInputModel(BaseModel):
    """
    修改日程的参数模型
    """

    sender_staff_id: str
    """发送消息的员工ID"""

    calendar_id: str
    """需要修改的日程ID"""

    calendar: CalendarModel
    """修改后的日程信息参数"""


class TodoModel(BaseModel):
    """
    待办事项的模型
    """

    subject: str
    """待办标题，最大长度1024。"""

    description: str|None = None
    """待办备注描述，最大长度4096。"""

    dueTime: int
    """截止时间，Unix时间戳，单位毫秒。"""

    executorIds: list[str]
    """执行者列表，需传用户的unionId"""

    reminderTimeStamp: int|None = None
    """待办任务的提醒时间，Unix时间戳，单位毫秒。要求必须大于当前时间，推荐设置为早于待办截止时间的5～10分钟。"""


class TodoCreateInputModel(BaseModel):
    """
    创建待办的参数模型
    """
    sender_staff_id: str
    """发送消息的员工ID"""

    subject: str
    """待办标题，最大长度1024。"""

    description: str | None = None
    """待办备注描述，最大长度4096。"""

    dueTime: int
    """截止时间，Unix时间戳，单位毫秒。"""

    reminderTimeStamp: int | None = None
    """待办任务的提醒时间，Unix时间戳，单位毫秒。要求必须大于当前时间，推荐设置为早于待办截止时间的5～10分钟。"""

class TodoQueryInputModel(BaseModel):
    """
    查询待办事项的参数模型
    """

    sender_staff_id: str
    """发送消息的员工ID"""


class TodoModifyInputModel(BaseModel):
    """
    修改待办事项的参数模型
    """

    sender_staff_id: str
    """发送消息的员工ID"""

    todo_id: str
    """需要更新的待办事项的ID"""

    subject: str|None = None
    """待办标题，最大长度1024。"""

    description: str | None = None
    """待办备注描述，最大长度4096。"""

    dueTime: int|None = None
    """截止时间，Unix时间戳，单位毫秒。"""

    done: bool|None = None
    """完成状态。"""

class TodoDeleteInputModel(BaseModel):
    """
    删除待办的参数模型
    """

    sender_staff_id: str
    """发送消息的员工ID"""

    todo_id: str
    """需要被删除的待办的ID"""

